#include "DockingArea.h"
#include "DockingSplitter.h"
#include "TabSidebar.h"
#include "TabManager.h"
#include "DockingTabStack.h"
#include <QHBoxLayout>
#include <QResizeEvent>
#include <QShowEvent>
#include <QTimer>
#include <QDebug>
#include <cassert>

DockingArea::DockingArea(QWidget* parent)
    : QWidget(parent)
    , m_tabManager(nullptr)
    , m_mainLayout(nullptr)
    , m_leftSidebar(nullptr)
    , m_rootSplitter(nullptr)
    , m_rightSidebar(nullptr)
    , m_leftSidebarVisible(false)
    , m_rightSidebarVisible(false)
    , m_isResetting(false)
    , m_layoutInitialized(false)
{
    setupDockingArea();
}

DockingArea::DockingArea(TabManager* tabManager, QWidget* parent)
    : QWidget(parent)
    , m_tabManager(tabManager)
    , m_mainLayout(nullptr)
    , m_leftSidebar(nullptr)
    , m_rootSplitter(nullptr)
    , m_rightSidebar(nullptr)
    , m_leftSidebarVisible(false)
    , m_rightSidebarVisible(false)
    , m_isResetting(false)
    , m_layoutInitialized(false)
{
    setupDockingArea();
}

DockingArea::~DockingArea() {
    // Qt会自动清理子widget
}

// === 初始化 ===

void DockingArea::setupDockingArea() {
    setupLayout();
    setupConnections();
    setupDefaultContent();
}

void DockingArea::setupLayout() {
    // 创建主布局
    m_mainLayout = new QHBoxLayout(this);
    m_mainLayout->setContentsMargins(0, 0, 0, 0);
    m_mainLayout->setSpacing(0);

    // 创建左侧边栏（暂时隐藏）
    m_leftSidebar = new TabSidebar(Qt::LeftEdge, this);
    m_leftSidebar->setVisible(m_leftSidebarVisible);
    m_mainLayout->addWidget(m_leftSidebar);

    // 创建根分割器
    m_rootSplitter = new DockingSplitter(this, Qt::Horizontal, this);
    m_mainLayout->addWidget(m_rootSplitter);

    // 创建右侧边栏（暂时隐藏）
    m_rightSidebar = new TabSidebar(Qt::RightEdge, this);
    m_rightSidebar->setVisible(m_rightSidebarVisible);
    m_mainLayout->addWidget(m_rightSidebar);

    // 设置拉伸因子
    m_mainLayout->setStretchFactor(m_leftSidebar, 0);
    m_mainLayout->setStretchFactor(m_rootSplitter, 1);
    m_mainLayout->setStretchFactor(m_rightSidebar, 0);
}

void DockingArea::setupConnections()
{
    if (m_rootSplitter)
    {
        connect(m_rootSplitter, &DockingSplitter::splitterBecameEmpty,
                this, &DockingArea::onRootSplitterBecameEmpty);
    }
}

void DockingArea::setupDefaultContent()
{
    if (!m_rootSplitter) return;

    // 创建默认的TabStack
    m_rootSplitter->addTabStack();

    // 如果有TabManager，让它创建默认标签页
    if (m_tabManager)
    {
        m_tabManager->setPrimaryArea(this);
    }
}

// === 布局管理 ===

void DockingArea::setTabManager(TabManager* manager)
{
    // 断言：TabManager不应该重复设置
    assert(m_tabManager == nullptr || m_tabManager == manager && "TabManager should not be replaced");

    m_tabManager = manager;

    if (m_tabManager)
    {
        m_tabManager->setPrimaryArea(this);
    }
}

void DockingArea::resetToDefaultLayout()
{
    if (!m_rootSplitter) return;

    // 防止重复调用
    if (m_isResetting) {
        qDebug() << "resetToDefaultLayout() 已经在进行中，跳过重复调用";
        return;
    }
    m_isResetting = true;

    qDebug() << "=== resetToDefaultLayout() 开始，当前子控件数量:" << m_rootSplitter->count();

    // 清理现有内容 - 先收集所有子控件，然后删除
    QList<QWidget*> childrenToDelete;
    for (int i = 0; i < m_rootSplitter->count(); ++i)
    {
        QWidget* child = m_rootSplitter->widget(i);

        if (child)
        {
            childrenToDelete.append(child);
        }
    }

    qDebug() << "准备删除" << childrenToDelete.size() << "个子控件";

    // 删除所有收集到的子控件
    for (QWidget* child : childrenToDelete)
    {
        qDebug() << "删除子控件:" << child;
        // 不使用通配符断开连接，让Qt自然处理
        // 只是从父控件中移除，让Qt的父子关系机制处理信号断开
        child->setParent(nullptr);
        // 使用 deleteLater 延迟删除，让事件循环处理
        child->deleteLater();
    }

    qDebug() << "删除完成，剩余子控件数量:" << m_rootSplitter->count();

    qDebug() << "清理完成，重新创建默认布局";

    // 重新创建默认布局
    setupDefaultContent();

    emit layoutChanged();

    qDebug() << "=== resetToDefaultLayout() 完成";

    // 重置标志
    m_isResetting = false;
}

void DockingArea::createUE4LikeLayout()
{
    if (!m_rootSplitter) return;

    // 防止重复初始化
    if (m_layoutInitialized)
    {
        qDebug() << "UE4布局已经初始化，跳过重复调用";
        return;
    }

    m_layoutInitialized = true;

    qDebug() << "=== createUE4LikeLayout() 开始 ===";

    resetToDefaultLayout();

    // 创建UE5风格的布局（按照用户标注图）：
    // 主分割器（垂直）
    //   ├── 上部分割器（水平）- 工具栏区域 + 主视口 + 右侧面板
    //   └── 下部分割器（水平）- 底部Content Browser

    // 1. 创建主要的垂直分割器
    DockingSplitter* mainVerticalSplitter = m_rootSplitter->addSplitter(Qt::Vertical, 0);

    // 2. 创建上部的水平分割器（主视口区域）
    DockingSplitter* topHorizontalSplitter = mainVerticalSplitter->addSplitter(Qt::Horizontal);

    // 3. 在上部水平分割器中创建：中央视口 + 右侧Outliner
    topHorizontalSplitter->addTabStack(); // 中央视口
    topHorizontalSplitter->addTabStack(); // 右侧世界大纲

    // 4. 在主垂直分割器底部创建Content Browser
    mainVerticalSplitter->addTabStack();

    // 5. 设置比例
    // 主垂直分割器：上部(主视口区域):下部(Content Browser) = 70:30
    QList<int> mainVerticalSizes = {700, 300};
    mainVerticalSplitter->setSizes(mainVerticalSizes);

    // 上部水平分割器：中央视口:右侧面板 = 80:20
    QList<int> topHorizontalSizes = {800, 200};
    topHorizontalSplitter->setSizes(topHorizontalSizes);

    // 6. 为各个区域添加默认标签页（如果有TabManager的话）
    if (m_tabManager)
    {
        qDebug() << "开始为各区域添加标签页...";

        // 为中央视口添加Viewport标签
        if (m_tabManager->spawnTab("Viewport"))
        {
            ;
        }

        // 为右侧面板添加WorldOutliner标签
        if (m_tabManager->spawnTab("WorldOutliner"))
        {
            ;
        }

        // 为底部添加ContentBrowser标签
        if (m_tabManager->spawnTab("ContentBrowser"))
        {
            ;
        }

        // 也可以添加其他标签页
        if (m_tabManager->spawnTab("DetailsPanel"))
        {
            ;
        }

        if (m_tabManager->spawnTab("OutputLog"))
        {
            ;
        }
    }

    emit layoutChanged();

    qDebug() << "=== createUE4LikeLayout() 完成 ===";
}

// === 侧边栏管理 ===

void DockingArea::showLeftSidebar(bool show) {
    if (m_leftSidebarVisible != show) {
        m_leftSidebarVisible = show;
        if (m_leftSidebar) {
            m_leftSidebar->setVisible(show);
        }
        emit sidebarVisibilityChanged(m_leftSidebarVisible, m_rightSidebarVisible);
    }
}

void DockingArea::showRightSidebar(bool show) {
    if (m_rightSidebarVisible != show) {
        m_rightSidebarVisible = show;
        if (m_rightSidebar) {
            m_rightSidebar->setVisible(show);
        }
        emit sidebarVisibilityChanged(m_leftSidebarVisible, m_rightSidebarVisible);
    }
}

bool DockingArea::isLeftSidebarVisible() const {
    return m_leftSidebarVisible && m_leftSidebar && m_leftSidebar->isVisible();
}

bool DockingArea::isRightSidebarVisible() const {
    return m_rightSidebarVisible && m_rightSidebar && m_rightSidebar->isVisible();
}

// === 查找功能 ===

DockingTabStack* DockingArea::findTabStackContaining(QWidget* content) const {
    if (!m_rootSplitter || !content) return nullptr;

    return m_rootSplitter->findTabStackContaining(content);
}

QList<DockingTabStack*> DockingArea::getAllTabStacks() const {
    if (!m_rootSplitter) return QList<DockingTabStack*>();

    return m_rootSplitter->getAllTabStacks();
}

// === Qt事件重写 ===

void DockingArea::resizeEvent(QResizeEvent* event) {
    QWidget::resizeEvent(event);
    // 布局会自动调整
}

void DockingArea::showEvent(QShowEvent* event) {
    QWidget::showEvent(event);

    // 首次显示时创建默认布局
    static bool firstShow = true;
    if (firstShow) {
        firstShow = false;
        QTimer::singleShot(0, this, [this]() {
            createUE4LikeLayout();
        });
    }
}

// === 槽函数 ===

void DockingArea::onRootSplitterBecameEmpty() {
    // 根分割器变空时，重新创建默认内容
    // 但要避免在重置过程中重复调用
    if (!m_isResetting) {
        qDebug() << "根分割器变空，重新创建默认内容";
        setupDefaultContent();
    } else {
        qDebug() << "重置过程中忽略根分割器变空信号";
    }
}
